package com.zrkizzy.seckill.config.resolver;

import com.zrkizzy.seckill.config.context.UserContext;
import com.zrkizzy.seckill.entity.User;
import org.springframework.core.MethodParameter;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

/**
 * 自定义用户参数
 *
 * @author zhangrongkang
 * @since 2023/3/21
 */
@Component
public class UserArgumentResolver implements HandlerMethodArgumentResolver {

    /**
     * <p>解析控制器方法参数</p>
     * 检查控制器方法是否有一个User类型的参数，并在支持该参数时调用resolveArgument()方法进行处理，
     * 只有当 Controller 中存在名为 User 的对象时才会使用此 Resolver 进行处理
     *
     * @param methodParameter MethodParameter类型参数
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        // 只有返回true时才执行resolveArgument方法
        return methodParameter.getParameterType() == User.class;
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        // 避免了在每个 controller 方法里都需要手动调用 userService.getUserByCookie 获取当前登录用户的问题
        return UserContext.getUser();
    }

}
